package com.binhthuan.catechist.client.dto;

import java.util.Date;

import name.pehl.piriti.client.json.Json;
import name.pehl.piriti.client.json.JsonReader;
import name.pehl.piriti.client.json.JsonWriter;

import com.google.gwt.core.client.GWT;

/**
 * @author Giang Đinh - Tài khoản người dùng, tương ứng với bảng
 *         <b>tai_khoan</b> trong cơ sở dữ liệu.
 */
public class Account {
    
    public interface AccountReader extends JsonReader<Account> {
    }
    public interface AccountWriter extends JsonWriter<Account> {
    }

    public static AccountReader READER = GWT.create(AccountReader.class);
    public static AccountWriter WRITER = GWT.create(AccountWriter.class);
    
    /**
     * Mã tài khoản.
     */
    @Json
    private Integer id;
    
    /**
     * Giáo lý viên sở hữu tài khoản.
     */
    @Json
    private Catechist catechist;

    /**
     * Tên đăng nhập.
     */
    @Json
    private String username;

    /**
     * Mật khẩu.
     */
    @Json
    private String password;

    /**
     * Câu hỏi bảo mật.
     */
    @Json
    private String securityQuestion;

    /**
     * Trả lời cho câu hỏi bảo mật.
     */
    @Json
    private String securityAnswer;

    /**
     * Thời gian đăng nhập lần cuối.
     */
    @Json(format = "dd/MM/yyyy hh:mm:ss")
    private Date lastLoginDate;

    /**
     * IP dùng để đăng nhập lần cuối.
     */
    @Json
    private String lasLoginIP;

    /**
     * Trạng thái của tài khoản (bị khóa hay không).
     */
    @Json
    private Boolean locked;

    public Account() {

    }

    /**
     * Lấy mã tài khoản.
     * @return Mã tài khoản.
     */
    public Integer getId() {
        return id;
    }

    /**
     * Gán mã tài khoản.
     * @param id
     *            Mã tài khoản.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Lấy người sở hữu tài khoản.
     * @return Giáo lý viên sở hữu tài khoản.
     */
    public Catechist getCatechist() {
        return catechist;
    }

    /**
     * Gán người sở hữu tài khoản.
     * @param catechist
     *            Giáo lý viên sở hữu tài khoản.
     */
    public void setCatechist(Catechist catechist) {
        this.catechist = catechist;
    }

    /**
     * Lấy tên đăng nhập.
     * @return Tên đăng nhập.
     */
    public String getUsername() {
        return username;
    }

    /**
     * Gán tên đăng nhập.
     * @param username
     *            Tên đăng nhập.
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * Lấy mật khẩu.
     * @return Mật khẩu.
     */
    public String getPassword() {
        return password;
    }

    /**
     * Gán mật khẩu.
     * @param password
     *            Mật khẩu.
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Lấy câu hỏi bảo mật.
     * @return Câu hỏi bảo mật.
     */
    public String getSecurityQuestion() {
        return securityQuestion;
    }

    /**
     * Gán câu hỏi bảo mật.
     * @param securityQuestion
     *            Câu hỏi bảo mật.
     */
    public void setSecurityQuestion(String securityQuestion) {
        this.securityQuestion = securityQuestion;
    }

    /**
     * Lấy câu trả lời cho câu hỏi bảo mật.
     * @return Câu trả lời cho câu hỏi bảo mật.
     */
    public String getSecurityAnswer() {
        return securityAnswer;
    }

    /**
     * Gán câu trả lời cho câu hỏi bảo mật.
     * @param securityAnswer
     *            Câu trả lời cho câu hỏi bảo mật.
     */
    public void setSecurityAnswer(String securityAnswer) {
        this.securityAnswer = securityAnswer;
    }

    /**
     * Lấy ngày đăng nhập lần cuối.
     * @return Ngày đăng nhập lần cuối.
     */
    public Date getLastLoginDate() {
        return lastLoginDate;
    }

    /**
     * Gán ngày đăng nhập lần cuối.
     * @param lastLoginDate
     *            Ngày đăng nhập lần cuối.
     */
    public void setLastLoginDate(Date lastLoginDate) {
        this.lastLoginDate = lastLoginDate;
    }

    /**
     * Lấy IP dùng để đăng nhập lần cuối.
     * @return IP dùng để đăng nhập lần cuối.
     */
    public String getLasLoginIP() {
        return lasLoginIP;
    }

    /**
     * Gán IP dùng để đăng nhập lần cuối.
     * @param lasLoginIP
     *            IP dùng để đăng nhập lần cuối.
     */
    public void setLasLoginIP(String lasLoginIP) {
        this.lasLoginIP = lasLoginIP;
    }

    /**
     * Kiểm tra tài khoản có bị khóa hay không.
     * @return <b>true</b> - Tài khoản bị khóa.
     */
    public Boolean isLocked() {
        return locked;
    }
    
    /**
     * Kiểm tra tài khoản có bị khóa hay không.
     * @return <b>true</b> - Tài khoản bị khóa.
     */
    public Boolean getLocked() {
        return locked;
    }

    /**
     * Gán trạng thái cho tài khoản
     * @param locked
     *            Trạng thái khóa của tài khoản.
     */
    public void setLocked(Boolean locked) {
        this.locked = locked;
    }
}
